home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / strlibs.zip / STRNREV.ASM < prev    next >
Assembly Source File  |  1993-01-04  |  2KB  |  107 lines

  1. ;       Static Name Aliases
  2. ;
  3.         TITLE   strnrev
  4. ;       NAME    strnrev.C
  5.  
  6. ;   char *strnrev(dst, src, len)
  7. ;
  8. ;   copies len characters of src to dst, in REVERSE order.  dst will
  9. ;   be terminated by a NUL character.
  10. ;
  11. ;   Returns a pointer to dst.
  12. ;
  13. ;   Note: this function is perfectly happy to reverse a string into the
  14. ;   same place, strnrev(x, x, L) will work.
  15. ;
  16. ;   It will not work for partially overlapping source and destination.
  17.  
  18.         .287
  19. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  20. _TEXT   ENDS
  21. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  22. _DATA   ENDS
  23. CONST   SEGMENT  WORD PUBLIC 'CONST'
  24. CONST   ENDS
  25. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  26. _BSS    ENDS
  27. DGROUP  GROUP   CONST,  _BSS,   _DATA
  28.         ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  29. EXTRN   __chkstk:NEAR
  30. _TEXT      SEGMENT
  31.  
  32.         PUBLIC  _strnrev
  33. _strnrev        PROC NEAR
  34.  
  35. ;       dsta = 4
  36. ;       register si = dsta
  37. ;       srca = 6
  38. ;       register di = srca
  39. ;       len = 8
  40. ;       dstz = -2
  41. ;       srcz = -6
  42. ;       result = -4
  43.  
  44.         push    bp
  45.         mov     bp,sp
  46.         mov     ax,6
  47.         call    __chkstk
  48.         push    di
  49.         push    si
  50.         mov     si,[bp+4]                ;dsta
  51.         mov     word ptr [bp-4],si       ;result
  52.         mov     di,[bp+6]                ;srca
  53.  
  54. int 3
  55.         mov     cx,[bp+8]
  56.         mov     al,0
  57.         repnz   scasb
  58.         jcxz    no_adj
  59.         inc     cx
  60.         dec     di
  61. no_adj:
  62.  
  63.         mov     bx,[bp+8]
  64.         sub     bx,cx
  65.         add     si,bx
  66.         mov     word ptr [bp-2],si   ;dstz
  67.         mov     byte ptr [si],al
  68.         mov     word ptr [bp-6],di   ;srcz
  69.  
  70.         mov     si,[bp+4]       ;dsta
  71.         mov     di,[bp+6]       ;srca
  72. ;       mov     word ptr [bp-4],si      ;result
  73.  
  74.         jmp     SHORT $L20002
  75. $WC19:
  76.  
  77.         dec     WORD PTR [bp-6] ;srcz
  78.         mov     bx,[bp-6]       ;srcz
  79.         mov     cl,[bx]
  80. ;       cbw
  81. ;       mov     [bp-4],ax       ;t
  82.  
  83.         dec     WORD PTR [bp-2] ;dstz
  84.         mov     bx,[bp-2]       ;dstz
  85.         mov     al,[di]
  86.         inc     di
  87.         mov     [bx],al
  88.  
  89. ;       mov     al,[bp-4]       ;t
  90.         mov     [si],cl
  91.         inc     si
  92.  
  93. $L20002:
  94.         cmp     [bp-6],di       ;srcz
  95.         ja      $WC19
  96.  
  97.         mov     ax,[bp-4]
  98.         pop     si
  99.         pop     di
  100.         mov     sp,bp
  101.         pop     bp
  102.         ret
  103.  
  104. _strnrev        ENDP
  105. _TEXT   ENDS
  106. END
  107.